package com.tinyseed.hmxx.common.utils;

import cn.hutool.core.codec.Base64;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.RSA;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.security.KeyPair;
import java.security.PrivateKey;
import java.security.PublicKey;

/**
 * @version Revision 1.0.0
 * @版权：
 * @author: Howard
 * @email:
 * @see:
 * @创建日期：2020/2/24
 * @功能说明：加密工具类
 * @begin
 * @修改记录:
 * @修改后版本 修改人        修改内容
 * @2020/2/24 wuxiran        创建
 * @end
 */
@Component
@Slf4j
public class RSAUtils {

    private RSA rsa;

    private KeyPair keyPair;

    public RSAUtils() {

        keyPair = Keys.keyPairFor(SignatureAlgorithm.RS256);
        rsa = new RSA(keyPair.getPrivate(), keyPair.getPublic());
    }

    /**
     * Description 非对称加密 公钥加密
     * Version 1.0
     * Date 2020/2/24 3:32 下午
     * Author howard
     *
     * @param source 返回加密后的字符串
     * @return
     */
    public String publicKeyEncrypt(String source) {
        byte[] encrypt = rsa.encrypt(StrUtil.bytes(source, CharsetUtil.UTF_8), KeyType.PublicKey);
        return Base64.encode(encrypt);
    }
    /**
     * Description 对称解密 私钥解密(解密base64字符串)
     * Version 1.0
     * Date 2020/2/24 3:34 下午
     * Author howard
     *
     * @param base64Str 字符串
     * @return 返回解密后的字符串
     */
    public String privateKeyDecypt(String base64Str) {
        byte[] decrypt = rsa.decrypt(Base64.decode(base64Str), KeyType.PrivateKey);
        return StrUtil.str(decrypt, CharsetUtil.CHARSET_UTF_8);
    }

    /**
     * Description 私钥加密 用于签名认证
     * Version 1.0
     * Date 2020/2/26 4:56 下午
     * Author howard
     *
     * @param source 来源字符串
     * @return
     */
    public String privateKeyEncrypt(String source) {
        byte[] encrypt = rsa.encrypt(StrUtil.bytes(source, CharsetUtil.UTF_8), KeyType.PrivateKey);
        return Base64.encode(encrypt);
    }

    /**
     * Description 公钥解密
     * Version 1.0
     * Date 2020/2/26 4:56 下午
     * Author howard
     *
     * @param base64Str 加密后的base64字符串
     * @return
     */
    public String publicKeyDecypt(String base64Str) {
        byte[] decrypt = rsa.decrypt(Base64.decode(base64Str), KeyType.PrivateKey);
        return StrUtil.str(decrypt, CharsetUtil.CHARSET_UTF_8);
    }

    /**
     * Description 返回公钥
     * Version 1.0
     * Date 2020/2/26 5:00 下午
     * Author howard
     * @return 返回公钥base64字符串
     */
//    public String getPublicKeyBase64Str() {
//        return publicKey;
//    }

//    public String getPrivateKeyBase64Str(){
//        return privateKey;
//    }

    /**
     * Description 获取公钥
     * Version 1.0
     * Date 2020/2/26 5:01 下午
     * Author howard
     */
    public PublicKey getPublicKey() {
        return keyPair.getPublic();
    }

    /*返回公钥*/
    public PrivateKey getPrivateKey() {
        return keyPair.getPrivate();
    }

}
